package org.example.common;

import lombok.Data;
import org.springframework.util.Assert;

import java.io.Serializable;

/**
 * JSON 响应结果
 * @author sxz
 **/
@Data
public class JsonResult<T> implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    /**
     * 状态码 0:操作失败;1操作成功
     */
    private int status;

    /**
     * 文中提示信息，由服务器返回后，在H5显示
     */
    private String msg;

    /**
     * 错误代码，系统全局唯一
     */
    private String code;

    /**
     * 返回json 的数据部分
     */
    private T data;

    /**
     * 无参构造
     */
    public JsonResult() {
    }

    /**
     * 有参构造
     *
     * @param status 状态参数
     * @param msg    返回语句
     * @param data   返回数据
     */
    public JsonResult(int status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }


    /**
     * 创建一个操作成功的 JsonResult
     *
     * @param message 消息字符串
     * @param data    数据
     * @return 操作成功的 JsonResult
     */
    public static <T> JsonResult<T> ok(String message, T data) {
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setStatus(1);
        // 和R兼容,设置0表示成功
        jsonResult.setCode("0");
        jsonResult.setMsg(message);
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 返回结果，默认message：成功
     * @param data
     * @param <T>
     * @return
     */
    public static <T> JsonResult<T> ok(T data) {
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setStatus(1);
        // 和R兼容,设置0表示成功
        jsonResult.setCode("0");
        jsonResult.setMsg("成功");
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 创建一个操作成功的 JsonResult
     *
     * @param message 消息字符串
     * @return 操作成功的 JsonResult
     */
    public static <T> JsonResult<T> okNoData(String message) {
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setStatus(1);
        // 和R兼容,设置0表示成功
        jsonResult.setCode("0");
        jsonResult.setMsg(message);
        return jsonResult;
    }

    /**
     * 创建一个操作失败的 JsonResult
     *
     * @param message 消息字符串
     * @param data    数据
     * @param errCode 错误代码
     * @return 操作成功的 JsonResult
     */
    public static <T> JsonResult<T> error(String message, T data, String errCode) {
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setStatus(0);
        jsonResult.setMsg(message);
        jsonResult.setData(data);
        Assert.isTrue(!"0".equals(errCode), "不能使用code:0, 0表示成功");
        jsonResult.setCode(errCode);
        return jsonResult;
    }
}
